/**
 * Created by Administrator on 14-4-11.
 */
define(function(require, exports){
	var $ = require('jquery');
	var pubjs = require('pubjs');
	var util = require('util');
	var view = require('@base/view');

	var TimeZone = view.container.extend({
		init: function(config, parent){
			config = pubjs.conf(config, {
				'target': parent,
				'class': 'M-timeZoneSchedule'
			});
			var self = this;

			self.Super('init', arguments);

		},
		afterBuild: function(){
			var self = this;
			var el = this.getDOM();
			el = $('<div class="M-timeZoneScheduleTable"></div>').appendTo(el);
			el.append('<em class="arrow"/>');

			// 添加辅助按钮
			var buttons = [
				{'class': 'selectWorkday', 'onFunc': 'eventSelectWorkday', 'text': LANG('工作日')},
				{'class': 'selectWeekend', 'onFunc': 'eventSelectWeekend', 'text': LANG('周末')},
				{'class': 'selectInverse', 'onFunc': 'eventSelectInverse', 'text': LANG('反选')},
				{'class': 'clearAll', 'onFunc': 'eventClearAll', 'text': LANG('清空')}
			]

			var tab = self.$table = $('<table />');
			var head = $('<thead />').appendTo(tab);
			var body = self.$body = $('<tbody />').appendTo(tab);
			var tr, td, k, j;

			// 添加辅助按钮
			tr = $('<tr />').appendTo(head);
			td = $('<th colspan="8" align="right" class="buttonsDiv"/>').appendTo(tr);
			util.each(buttons, function(btn){
				k = $('<a/>').addClass(btn['class']).text(btn.text).appendTo(td);
				self.jq(k, 'click', btn.onFunc);
			});

			tr = $('<tr />').appendTo(head);
			tr.append(
				'<th><i data="0" title="0:00~0:59">00</i><i data="1" title="1:00~1:59">01</i><i data="2" title="2:00~2:59">02</i><i data="3" title="3:00~3:59">03</i></th>'+
					'<th><i data="4" title="4:00~4:59">04</i><i data="5" title="5:00~5:59">05</i><i data="6" title="6:00~6:59">06</i><i data="7" title="7:00~7:59">07</i></th>'+
					'<th><i data="8" title="8:00~8:59">08</i><i data="9" title="9:00~9:59">09</i><i data="10" title="10:00~10:59">10</i><i data="11" title="11:00~11:59">11</i></th>'+
					'<th><i data="12" title="12:00~12:59">12</i><i data="13" title="13:00~13:59">13</i><i data="14" title="14:00~14:59">14</i><i data="15" title="15:00~15:59">15</i></th>'+
					'<th><i data="16" title="16:00~16:59">16</i><i data="17" title="17:00~17:59">17</i><i data="18" title="18:00~18:59">18</i><i data="19" title="19:00~19:59">19</i></th>'+
					'<th><i data="20" title="20:00~20:59">20</i><i data="21" title="21:00~21:59">21</i><i data="22" title="22:00~22:59">22</i><i data="23" title="23:00~23:59">23</i></th>'
			);
			tr.find('th').addClass('range');
			tr.prepend('<th>'+LANG("日期")+'</th><th>'+LANG("时间段")+'</th>');

			var names = [
				LANG('星期日'),LANG('星期一'),LANG('星期二'),
				LANG('星期三'),LANG('星期四'),LANG('星期五'),LANG('星期六')
			];
			for (var i=0; i<7; i++){
				k = (i + 1) % 7;
				tr = $('<tr/>').attr('data-day', k).appendTo(body);
				tr.append('<td>'+names[k]+'</td>');
				tr.append('<td class="all_day">'+LANG("全天投放")+'</td>');
				for (j=0; j<24; j++){
					if (j%4 === 0){
						td = $('<td class="checkcon"/>').attr('data', Math.floor(j/4)).appendTo(tr);
					}
					td.append('<i class="checkbox" data="'+k+'-'+j+'" title="'+j+':00~'+j+':59"/>');
				}
			}

			tab.appendTo(el);

			self.dg(head, '.range i', 'click', 'eventRange');
			self.dg(body, '.all_day', 'click', 'eventAllDay');
			self.dg(body, 'i.checkbox', 'click', 'eventToggle');

		},
		// 该方法会生成本模块需要的时间data
		// 参数为需要的日子的数组，如[0, 6]表示星期日和星期六
		// 返回一个对象，格式与getData()相同
		_buildDaysData: function(daysArray) {
			// 小时数组
			var hourArr = [];
			for (var j = 0; j < 24; j++) {
				hourArr.push(j);
			}

			var daysData = {};
			var i, len;
			for (i = 0, len = daysArray.length; i < len; i++) {
				daysData[daysArray[i]] = hourArr.slice(0);
			}

			return daysData;
		},
		// 该方法取得子数组的补集
		// 第一个参数为父数组，第二个参数为子数组
		// 考虑将该方法添加到util
		_complementArray: function(fatherArray, subArray) {
			return fatherArray.filter(function(e) {
				return subArray.indexOf(e) < 0;
			})
		},
		// 选择周末
		eventSelectWeekend: function(evt, elm) {
			// 周末data对象
			var weekendData = this._buildDaysData([6, 0]);

			// 合并当前已选择的
			var newData = util.extend(this.getData(), weekendData)

			this.setData(newData);
		},
		// 选择工作日
		eventSelectWorkday: function(evt, elm) {
			// 工作日data对象
			var workdayData = this._buildDaysData([1, 2, 3, 4, 5]);

			// 合并当前已选则的
			var newData = util.extend(this.getData(), workdayData)

			this.setData(newData);
		},
		eventSelectInverse: function(evt, elm) {
			// 整星期的data
			var aWeekDays = [0, 1, 2, 3, 4, 5, 6];
			var aWeekData = this._buildDaysData(aWeekDays);

			// 取得补集
			var selectedData = this.getData();
			var inverseData = {};
			for (var key in aWeekData) {
				// 如果不存在该天
				if (!selectedData[key])	{
					// 添加一整天
					inverseData[key] = aWeekData[key].slice(0);
				} else {
					// 添加相补的小时
					var complementHours = this._complementArray(aWeekData[key], selectedData[key]);
					if (complementHours.length > 0) {
						inverseData[key] = complementHours;
					}
				}
			}

			this.setData(inverseData);
		},
		// 清空所有选择
		eventClearAll: function(evt, elm) {
			this.setData({})
		},
		/**
		 * 整周按照时间段选择
		 * @param  {jQuery}  evt jQuery事件对象
		 * @param  {Element} elm 事件触发DOM元素
		 * @return {None}        无返回
		 */
		eventRange: function(evt, elm){
			var data = $(elm).attr('data');
			var list = this.$body.find('.checkcon > i.checkbox[data$=-'+data+']');
			if (list.filter('.act').length == list.length){
				list.removeClass('act');
			}else {
				list.addClass('act');
			}
			list = null;
		},
		/**
		 * 整天日程选择
		 * @param  {jQuery}  evt jQuery事件对象
		 * @param  {Element} elm 事件触发DOM元素
		 * @return {None}        无返回
		 */
		eventAllDay: function(evt, elm){
			var list = $(elm).parent().find('i.checkbox');
			if (list.filter('.act').length == list.length){
				list.removeClass('act');
			}else {
				list.addClass('act');
			}
			list = null;
		},
		/**
		 * 按小时切换选中状态
		 * @param  {jQuery}  evt jQuery事件对象
		 * @param  {Element} elm 事件触发DOM元素
		 * @return {None}        无返回
		 */
		eventToggle: function(evt, elm){
			$(elm).toggleClass('act');
		},
		/**
		 * 设置控件选中的时间数据
		 * @param {Object} data 选中的时间格式
		 */
		setData: function(data){
			var boxs = this.$body.find('i.checkbox');
			boxs.removeClass('act');
			util.each(data, function(list, day){
				if (--day < 0) { day=6; }
				util.each(list, function(time){
					boxs.eq(day * 24 + time).addClass('act');
				});
			});
		},
		/**
		 * 获取控件选中的数据
		 * @return {Object} 返回选中的时间数据
		 */
		getData: function(){
			var data = {};
			var sels = this.$body.find('i.checkbox.act');
			var item, i;
			for (i=0; i<sels.length; i++){
				item = sels.eq(i).attr('data').split('-');
				if (!data[item[0]]){
					data[item[0]] = [];
				}
				data[item[0]].push(+item[1]);
			}
			sels = item = null;
			return data;
		},
		reset: function(){
			this.setData();
			return this;
		}
	});

	exports.base = TimeZone;

});
